#include <iostream>
using namespace std;
#include <map>

/*
	map中保存任意两种类型
	map<key_type, mapped_type> myMap; 
	pair<key_type, mapped_type> ---- > value_type
	key_type : 键类型
	mapped_type: 值类型

	map内部封装的是红黑树

	1 map中的元素的类型是pair类型 pair是一个支持任意两种类型的模板类
	2 默认以键的大小做升序排序
	3 键是唯一的不可重复的,不可修改
	4 如果键为自定义类型，必须重载<运算符,后者传入函数指针制定排序规则


	自定义一个学生类，创建map以Student作为键，学生分数作为值，实现学生的增删改查操作
	class Student{
		int 	id;
		string	name;
	//...
	};
*/

template <typename T, class Z>
struct Pair{
	T	first;
	Z	second;
	Pair(T first, Z second)
		:first(first),
		second(second)
	{
	
	}
};

bool cmp(char x, char y)
{
	return x > y;
}


int main(int argc, char **argv)
{
	map<char, int, bool(*)(char ,char)> myMap(cmp);
	pair<char, int> p('a', 3);
	pair<char, int> p1('z', 6);
	pair<char, int> p2('h', 7);
	

	myMap.insert(p);
	myMap.insert(p1);
	myMap.insert(p2);

	//pair<map<char, int>::iterator, bool> ret;
	/*
		bool: 成功返回true, 失败返回false
		iterator: 成功返回添加成功后键值对的迭代器，失败返回已经存在的键值对迭代器
	*/
	auto ret = myMap.insert(pair<char, int>('a', 10));
	if(ret.second == false){
		cout << "添加失败" << endl;
		map<char, int>::iterator rit = ret.first;
		cout << rit->first << "-----" << rit->second << endl;
	}else{
		cout << "添加成功" << endl;
	}

	//迭代器访问
	for(map<char, int>::iterator it = myMap.begin(); it != myMap.end(); it++){
		//pair<char, int> t = *it;
		//cout << t.first << "-----" << t.second << endl;
		cout << it->first << "----" << it->second << endl;
	}

	return 0;
}
